package com.zerdoor.service;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * @描述 通用支付接口，该接口中包含充值，支付、钱包使用日志的记录等
 * Created by zhongjieyu on 2014/12/23.
 */
public interface ICommonPayService {


    /**
     * 查询用户账户可用余额（总余额-冻结金额）
     * @param userId 用户ID
     * @return
     * @throws Exception
     */
    float findUserWalletEnough(Integer userId) throws Exception;

    /**
     * 支出，根据用户ID 和支付金额，更新用户账户余额
     * @param sumPrice 总金额
     * @param userId 用户ID
     * @param type 支付类型
     * @return true 表示支付成功，false 表示支付失败
     * @throws Exception
     */
    boolean updateDeductUserWalletByUserId(float sumPrice, Integer userId, Integer type) throws Exception;


    /**
     * 收入，根据用户ID 和充值金额，更新用户账户余额
     * @param money 收入金额
     * @param userId 用户ID
     * @param type 收入类型
     * @return true 表示支付成功，false 表示支付失败
     * @throws Exception
     */
    boolean updateChargeUserWalletByUserId(float money,Integer userId, Integer type) throws Exception;

    /**
     * 根据用户ID和金额解冻用户冻结账户金额
     * @param money 解冻总金额
     * @param userId 用户ID
     * @param type 收支类型
     * @param orderType 订单类型 true 表示任务订单 false 表示活动竞赛订单
     * @param orderId 订单ID
     * @return
     * @throws Exception
     */
    boolean updateThawFreezeMoneyByUserId(float money,Integer userId, Integer type,boolean orderType,Integer orderId) throws Exception;


    /**
     * 查询配置表数据（例如查询手续费比例、定金比例等）
     * @param configId 配置项ID
     * @return 返回比例百分比值
     * @throws Exception
     */
    float findScaleValue(int configId) throws Exception;


    /**
     * 冻结，根据用户ID 和支付金额，更新账户余额和冻结金额
     * @param sumPrice 总金额
     * @param userId 用户ID
     * @param type 支付类型
     * @param orderId 订单ID
     * @param orderType 订单类型 true 表示任务订单 false 表示活动竞赛订单
     * @param isDeposit 是否是托管定金 true 表示是托管定金 false 表示不是托管定金
     * @return true 表示支付成功，false 表示支付失败
     * @throws Exception
     */
    boolean updateBlockedUserWalletByUserId(float sumPrice, Integer userId, Integer type, Integer orderId,boolean orderType,boolean isDeposit) throws Exception;

    /**
     * 根据支付的金额判断用户余额是否充足
     * @param sumPrice 总金额
     * @param userId 用户ID
     * @return true 表示支付成功，false 表示支付失败
     * @throws Exception
     */
    boolean isUserWalletEnough(float sumPrice, Integer userId) throws Exception;

    /**
     * 根据用户ID扣除冻结金额余额
     * @param sumPrice 总金额
     * @param userId 用户ID
     * @param type 支付类型
     * @param orderId 订单ID
     * @param orderType 订单类型 true 表示任务订单 false 表示活动竞赛订单
     * @return true 表示支付成功，false 表示支付失败
     * @throws Exception
     */
    boolean updateFreezeMoneyByUserId(float sumPrice, Integer userId, Integer type, Integer orderId,boolean orderType) throws Exception;

    /**
     * 给中奖者钱包中打钱，并且扣除发布竞赛这钱包中的钱，剩余的钱返回给发布者。
     * @param list 获奖者列表
     * @param isFee 是否使用零手续费卡
     * @param isPopur 是否使用推广费
     * @param raceId 竞赛活动编号
     * @param totalPrice 订单总额
     * @param userId 发布竞赛活动用户编号
     * @param orderRaceId 竞赛活动订单编号
     */
    public void updateRaceMoney(List<Map<String, Object>> list, boolean isFee,boolean isPopur,int raceId,BigDecimal totalPrice,int userId,int orderRaceId) throws Exception;

    /**
     * 根据用户ID维护用户交易量数据
     * @param userId 用户ID
     * @throws Exception
     */
    void updateUserTradingNumByUserId(Integer userId) throws Exception;
}
